home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / m2gem106.lzh / CRYSTAL1.06 / TST / EYES / EYES.M2
Encoding:
Text File  |  1994-01-21  |  6.7 KB  |  290 lines

  1. MODULE Eyes;
  2.  
  3. (*
  4. UK 01/21/94
  5. *)
  6.  
  7. FROM ApplMgr    IMPORT ApplInit;
  8. FROM MenuMgr    IMPORT MenuRegister;
  9. FROM EvntMgr    IMPORT EvntEvent,MEvent,Event,MessageBlock,MuMesag,MuTimer,
  10.                        WMRedraw,WMTopped,WMClosed,WMMoved,
  11.                        AcOpen,AcClose;
  12. FROM WindMgr    IMPORT WindCreate,Wind,Name,Close,Move,
  13.                        WindOpen,WindClose,WindDelete,NoWindow,Desk;
  14. FROM RcMgr      IMPORT GRect,GPnt,RcIntersect;
  15. FROM GrafTool   IMPORT ShowMouse,HideMouse,GetMouse;
  16. FROM WindTool   IMPORT BeginUpdate,EndUpdate;
  17. FROM VDI        IMPORT XY,White,Black;
  18. FROM VOutput    IMPORT VRRecFl,VCircle,VEllipse;
  19. FROM VAttribute IMPORT VSWrMode,MdReplace,
  20.                        VSFColor,VSFPerimeter,VSFInterior,Interiors;
  21. FROM VDITool    IMPORT SetClip,OpenVirtualWorkstation,CloseVirtualWorkstation,
  22.                        GRectToArray;
  23. FROM PORTAB     IMPORT SIGNEDWORD,UNSIGNEDWORD,UNSIGNEDLONG,SIGNEDLONG;
  24. FROM INTRINSIC  IMPORT VOID,PTR;
  25. FROM pMATHLIB   IMPORT sqrt,realtoword,wordtoreal;
  26.  
  27. IMPORT WindGet,WindSet;
  28.  
  29. TYPE RedrawFlags = (All,EyesOnly);
  30.  
  31. VAR ApplId   : SIGNEDWORD;
  32.     MenuId   : SIGNEDWORD;
  33.     AccName  : ARRAY[0..7] OF CHAR;
  34.     WinName  : ARRAY[0..6] OF CHAR;
  35.     MyBlock  : MEvent;
  36.     MyEvent  : Event;
  37.     MyMessage: MessageBlock;
  38.     MyWindow : SIGNEDWORD;
  39.     OldPos   : GPnt;
  40.     LastRect : GRect;
  41.     GC       : UNSIGNEDWORD;
  42.  
  43. PROCEDURE DrawEyes(Redraw: RedrawFlags);
  44.  
  45. VAR Work  : GRect;
  46.     Rect  : GRect;
  47.     ActPos: GPnt;
  48.     Clip  : ARRAY[0..3] OF XY;
  49.  
  50.   PROCEDURE Pupils(MXY: GPnt;
  51.                    OX : SIGNEDWORD;
  52.                    OY : SIGNEDWORD);
  53.  
  54.   VAR X,Y,Z,F1,F2: REAL;
  55.  
  56.   BEGIN
  57.     WITH Work DO
  58.       X:= wordtoreal(MXY.GX - (GX + OX));
  59.       Y:= wordtoreal(MXY.GY - (GY + OY));
  60.       Z:= sqrt(X * X + Y * Y);
  61.  
  62.       IF Z # 0.0 THEN
  63.         F1:= 9.0 * X / Z;
  64.         F2:= 19.0 * Y / Z;
  65.       ELSE
  66.         F1:= 0.0;
  67.         F2:= 0.0;
  68.       END;
  69.  
  70.       VCircle(GC,GX + OX + realtoword(F1),GY + OY + realtoword(F2),10);
  71.     END;
  72.   END Pupils;
  73.  
  74.   PROCEDURE SetFill(Color    : UNSIGNEDWORD;
  75.                     Perimeter: BOOLEAN;
  76.                     Interior : Interiors);
  77.   BEGIN
  78.     VSFColor(GC,Color);
  79.     VSFPerimeter(GC,Perimeter);
  80.     VSFInterior(GC,Interior);
  81.   END SetFill;
  82.  
  83.   PROCEDURE DrawPupils;
  84.   BEGIN
  85.     SetFill(White,FALSE,FISSolid);
  86.     HideMouse;
  87.     Pupils(OldPos,25,40);
  88.     Pupils(OldPos,Work.GW - 25,40);
  89.     SetFill(Black,FALSE,FISSolid);
  90.     Pupils(ActPos,25,40);
  91.     Pupils(ActPos,Work.GW - 25,40);
  92.     ShowMouse;
  93.   END DrawPupils;
  94.  
  95. BEGIN
  96.   IF MyWindow = NoWindow THEN
  97.     RETURN;
  98.   END;
  99.  
  100.   BeginUpdate;
  101.  
  102.   WindGet.WorkXYWH(MyWindow,Work);
  103.   GetMouse(ActPos);
  104.  
  105.   IF (WindGet.Top() = MyWindow) AND (Redraw = EyesOnly) THEN
  106.     IF (ActPos.GX # OldPos.GX) OR (ActPos.GY # OldPos.GY) THEN
  107.       DrawPupils;
  108.     END;
  109.   ELSE
  110.     WindGet.FirstXYWH(MyWindow,Rect);
  111.  
  112.     WHILE (Rect.GW > 0) AND (Rect.GH > 0) DO
  113.       IF RcIntersect(Work,Rect) THEN
  114.         SetClip(GC,Rect);
  115.  
  116.         IF Redraw = All THEN
  117.           SetFill(White,FALSE,FISSolid);
  118.           GRectToArray(Rect,Clip);
  119.           HideMouse;
  120.           VRRecFl(GC,Clip);
  121.           SetFill(Black,TRUE,FISHollow);
  122.           VEllipse(GC,Work.GX + 25,Work.GY + 40,20,35);
  123.           VEllipse(GC,Work.GX + Work.GW - 25,Work.GY + 40,20,35);
  124.           ShowMouse;
  125.         END;
  126.  
  127.         IF (ActPos.GX # OldPos.GX) OR (ActPos.GY # OldPos.GY) OR (Redraw = All) THEN
  128.           DrawPupils;
  129.         END;
  130.  
  131.         WindGet.NextXYWH(MyWindow,Rect);
  132.       END;
  133.     END;
  134.   END;
  135.  
  136.   OldPos:= ActPos;
  137.   EndUpdate;
  138. END DrawEyes;
  139.  
  140. PROCEDURE DoRedraw(Handle: SIGNEDWORD);
  141. BEGIN
  142.   IF Handle = MyWindow THEN
  143.     DrawEyes(All);
  144.   END;
  145. END DoRedraw;
  146.  
  147. PROCEDURE DoTopped(Handle: SIGNEDWORD);
  148. BEGIN
  149.   IF Handle = MyWindow THEN
  150.     WindSet.Top(Handle);
  151.   END;
  152. END DoTopped;
  153.  
  154. PROCEDURE DoMoved(Handle: SIGNEDWORD; VAR Rectangle: GRect);
  155. BEGIN
  156.   IF Handle = MyWindow THEN
  157.     WindSet.CurrXYWH(Handle,Rectangle);
  158.     LastRect.GX:= Rectangle.GX;
  159.     LastRect.GY:= Rectangle.GY;
  160.     DrawEyes(All);
  161.   END;
  162. END DoMoved;
  163.  
  164. PROCEDURE DoClose(Handle: SIGNEDWORD);
  165. BEGIN
  166.   IF Handle = MyWindow THEN
  167.     WindClose(Handle);
  168.     WindDelete(Handle);
  169.     MyWindow:= NoWindow;
  170.     MyBlock.EFlags:= Event{MuMesag};
  171.   END;
  172. END DoClose;
  173.  
  174. PROCEDURE DoAcOpen(Id: SIGNEDWORD);
  175.  
  176. VAR Full: GRect;
  177.     Pos : GPnt;
  178.  
  179. BEGIN
  180.   IF Id = MenuId THEN
  181.     IF MyWindow # NoWindow THEN
  182.       WindSet.Top(MyWindow);
  183.     ELSE
  184.       IF GC = 0 THEN
  185.         IF NOT OpenVirtualWorkstation(GC) THEN
  186.           RETURN;
  187.         END;
  188.         VSWrMode(GC,MdReplace);
  189.       END;
  190.  
  191.       WindGet.WorkXYWH(Desk,Full);
  192.       MyWindow:= WindCreate(Wind{Name,Close,Move},Full);
  193.  
  194.       IF MyWindow = NoWindow THEN
  195.         RETURN;
  196.       END;
  197.  
  198.       WinName:= " Eyes ";
  199.       WindSet.Name(MyWindow,WinName);
  200.  
  201.       IF LastRect.GY = -1 THEN
  202.         GetMouse(Pos);
  203.         LastRect.GX:= Pos.GX;
  204.         LastRect.GY:= Pos.GY;
  205.       END;
  206.  
  207.       LastRect.GW:= 100;
  208.       LastRect.GH:= 100;
  209.  
  210.       WindOpen(MyWindow,LastRect);
  211.     END;
  212.  
  213.     MyBlock.EFlags:= Event{MuMesag,MuTimer};
  214.   END;
  215. END DoAcOpen;
  216.  
  217. PROCEDURE DoAcClose(Id: SIGNEDWORD);
  218. BEGIN
  219.   IF Id = MenuId THEN
  220.     IF GC > 0 THEN
  221.       CloseVirtualWorkstation(GC); (* GC:= 0 *)
  222.     END;
  223.     MyWindow:= NoWindow;
  224.     MyBlock.EFlags:= Event{MuMesag};
  225.   END;
  226. END DoAcClose;
  227.  
  228. BEGIN
  229.   ApplId:= ApplInit();
  230.  
  231.   IF ApplId >= 0 THEN
  232.     AccName:= "  Eyes ";
  233.     MenuId:= MenuRegister(ApplId,AccName);
  234.  
  235.     IF MenuId >= 0 THEN
  236.       GC:= 0;
  237.  
  238.       MyWindow:= NoWindow;
  239.       LastRect.GY:= -1;
  240.  
  241.       OldPos.GX:= -1;
  242.       OldPos.GY:= -1;
  243.  
  244.       WITH MyBlock DO
  245.         EFlags:= Event{MuMesag};
  246.         EMePBuf:= PTR(MyMessage);
  247.         ELoCount:= 100;
  248.         EHiCount:= 0;
  249.       END;
  250.  
  251.       WHILE TRUE DO
  252.         MyEvent:= EvntEvent(MyBlock);
  253.  
  254.         IF MuMesag IN MyEvent THEN
  255.           WITH MyMessage DO
  256.             CASE Type OF
  257.               WMRedraw:
  258.                 DoRedraw(Handle);
  259.             | WMTopped:
  260.                 DoTopped(Handle);
  261.             | WMMoved:
  262.                 DoMoved(Handle,Rect);
  263.             | WMClosed:
  264.                 DoClose(Handle);
  265.             | AcOpen:
  266.                 DoAcOpen(OpenId);
  267.             | AcClose:
  268.                 DoAcClose(CloseId);
  269.             ELSE
  270.               ;
  271.             END;
  272.           END;
  273.         END;
  274.  
  275.         IF MuTimer IN MyEvent THEN
  276.           DrawEyes(EyesOnly);
  277.         END;
  278.  
  279.       END;
  280.     ELSE
  281.       WITH MyBlock DO
  282.         EFlags:= Event{MuTimer};
  283.         ETime:= MAX(UNSIGNEDLONG);
  284.       END;
  285.       WHILE TRUE DO
  286.         VOID(EvntEvent(MyBlock));
  287.       END;
  288.     END;
  289.   END;
  290. END Eyes.